import os, sys
import json
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCP
from openai import OpenAI

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../')))
from insight_agent.utils.http_post import get_insight_request, inform_insight_thinking, update_insight_result

# 加载环境变量
load_dotenv(override=True)
# 创建MCP
mcp = FastMCP("t2sServer")

def deepseek_response(query: str):
    client = OpenAI(api_key=os.getenv("ALIYUN_KEY"), base_url=os.getenv("ALI_BASE_URL"))

    response = client.chat.completions.create(
        model=os.getenv("ALIYUN_MODEL"),
        messages=[
            {"role": "system", "content": "You are a helpful assistant"},
            {"role": "user", "content": query},
        ],
        stream=False
    )
    return response.choices[0].message.content


# Tools
@mcp.tool()
async def text_to_sql(sql_query: str, query_key_parameter: str) -> str:
    """
    本工具的功能是把用户的自然语言表述的需求转化为数据库查询语句sql
    输入为用户query,和query关键参数query_key_parameter
    输入为sql语句，字符串形式
    请识别用户的查询需求和预测需求，只需要把查询需求转换为sql，下面是举例
    1.
    query是 请帮我分析北京市2025年7月3日到2025年7月16日每日总家宽条数的变化，并预测之后一周的数据并用图表展示
    那么查询需求是 请帮我分析北京市2025年7月3日到2025年7月16日每日总家宽条数的变化
    预测需求是 预测之后一周的数据并用图表展示
    """
    inform_insight_thinking("agent_time_series", f'tools - text_to_sql')

    schema_description = """
    - 有且仅有一个table: user_data
    
    - user_data中的字段含义，第一行为表头，然后每一行是字段的详细信息：
    字段中文名	字段英文名	字段类型	样例	注释
    统计时间	STATIS_TIME	字符串	20250731	
    省份	PROV	字符串	北京、山东、云南	
    自然人编码	PERSON_ID	字符串	P00001-P99999	
    手机号码	PHONE_NUM	字符串	13900000000	
    用户编码	USER_ID	字符串	U00001-U99999	
    客户编码	CUST_ID	字符串	C00001-C99999	
    属性-年龄	ATTR_AGE	整数	29	
    属性-性别	ATTR_GENDER	字符串	男、女	
    属性-省	ATTR_PROVINCE	字符串	北京市	
    属性-市	ATTR_CITY	字符串	海淀区	
    属性-区县街道	ATTR_COUNTY	字符串	中关村街道	
    属性-所属网格编码	ATTR_GRID_ID	字符串	G001-G999	
    属性-所属网格经度	ATTR_GRID_LAT	浮点数	39.43-41.05	
    属性-所属网格纬度	ATTR_GRID_LONG	浮点数	115.25-117.30	
    属性-日间常驻基站编码	ATTR_DAY_BASE_ID	字符串	B0001-B9999	
    属性-日间常驻基站经度	ATTR_DAY_BASE_LAT	浮点数	39.43-41.05	
    属性-日间常驻基站纬度	ATTR_DAY_BASE_LONG	浮点数	115.25-117.30	
    属性-夜间常驻基站编码	ATTR_NIGHT_BASE_ID	字符串	B0001-B9999	
    属性-夜间常驻基站经度	ATTR_NIGHT_BASE_LAT	浮点数	39.43-41.05	
    属性-夜间常驻基站纬度	ATTR_NIGHT_BASE_LONG	浮点数	115.25-117.30	
    属性-资费波动标签	ATTR_FEE_FLUCTUATION	字符串	稳定型、波动型	
    标签-是否全球通用户	LABEL_IS_GSM	整数	0、1	
    标签-是否腰部用户	LABEL_IS_MID	整数	0、1	
    标签-是否中高端用户	LABEL_IS_PREM	整数	0、1	
    标签-是否异网用户	LABEL_IS_DIFF	整数	0、1	若为异网用户，则用户编码、客户编码、年龄、所属网格、是否全球通/腰部/中高端/银发/用户、指标、使用流量、通话时长置空
    标签-是否银发用户	LABEL_IS_ELDER	整数	0、1	
    标签-是否国际用户	LABEL_IS_INT	整数	0、1	
    属性-家庭圈ID	ATTR_FAMILY_CIRCLE_ID	字符串	FC001-FC999	与家人之间的关系形成的圈
    属性-地理圈ID	ATTR_GEO_CIRCLE_ID	字符串	GEO001-GEO999	日间地理圈
    属性-交往圈ID	ATTR_SOCIAL_CIRCLE_ID	字符串	SC001-SC999	与朋友、同事等社交关系形成的圈
    属性-社区圈ID	ATTR_COMMUNITY_CIRCLE_ID	字符串	CYC001-CYC999	与居住地的邻居关系形成的圈
    属性-校园圈ID	ATTR_CAMPUS_CIRCLE_ID	字符串	CPC001-CPC999	在学校中与同学、老师和的关系形成的圈
    属性-通勤圈ID	ATTR_COMMUTE_CIRCLE_ID	字符串	CTC001-CTC999	日常上下班/学的路线和相关地点形成的圈
    属性-商业圈ID	ATTR_BUSINESS_CIRCLE_ID	字符串	BC001-BC999	在商圈附近活动形成的圈
    属性-网络圈ID	ATTR_ONLINE_CIRCLE_ID	字符串	OC001-OC999	互联网建立的虚拟社交网络形成的圈
    指标-ARPU（元）	METRIC_ARPU	浮点数	139.9	过去12个月的平均月资费
    指标-使用流量（MB）	METRIC_FLUX_USED	浮点数	2097152.66	
    指标_家宽条数	METRIC_BROADBAND_COUNT	整数	2	单位：条
    指标_家宽平均流量（MB）	METRIC_BROADBAND_TRAFFIC	浮点数	203002	单位：MB  自然人宽带流量均值
    指标_家宽在线时长（分钟）	METRIC_BROADBAND_ONLINETIME	浮点数	68400	单位：分钟  自然人在线时长均值
    指标-月消费金额(元)	METRIC_MONTHLY_CONSUMPTION	浮点型	128.50、256.80	
    指标-基本套餐费(元）	METRIC_BASIC_PACKAGE_FEE	浮点型	58.00、88.00	
    指标-本地通话费（元）	METRIC_LOCAL_CALL_FEE	浮点型	15.30、28.50	
    指标-异地通话费（元）	METRIC_LONG_DISTANCE_CALL_FEE	浮点型	8.20、0.00	
    指标-国内流量包业务费（元）	METRIC_DOMESTIC_DATA_FEE	浮点型	25.00、45.00	
    指标-国际流量包业务费（元）	METRIC_INTERNATIONAL_DATA_FEE	浮点型	0.00、15.60	
    指标-附加业务费（元）	METRIC_ADDITIONAL_SERVICE_FEE	浮点型	12.00、20.00	
    指标-增值业务费（元）	METRIC_VALUE_ADDED_SERVICE_FEE	浮点型	10.00、18.30	
    指标-流量使用费（元）	METRIC_DATA_USAGE_FEE	浮点型	5.2、12.8	
    指标-通话时长（分钟）	METRIC_CALL_DURATION_MINUTES	整型	2、3	
    属性-激活日期	ATTR_NUMBER_ACTIVATION_DATE	时间	20180317	
    属性-套餐名称	ATTR_NUMBER_PLAN_NAME	字符串	移动：移动大王卡，全球通尊享套餐，神州行畅聊卡，5G智享套餐，和飞享套餐
    电信：电信无忧卡，十全十美套餐，天翼畅享套餐，5G融合套餐，青年一派卡
    联通：联通大王卡，冰淇淋套餐，沃派套餐，G畅爽套餐，校园套餐
        
    属性-离网日期	ATTR_NUMBER_TERMINATION_DATE	时间	20180317	
    属性-入网地址	ATTR_NUMBER_REGISTERED_LOCATION	字符串	北京市房山区	
    指标-套餐总流量（MB）	METRIC_NUMBER_DATA_ALLOWANCE_MB	整型	20	
    指标-套餐总通话时长（分钟）	METRIC_NUMBER_FREE_CALL_MINUTES	整型	200	
    标签-是否携号转网	LABEL_NUMBER_PORTABILITY_STATUS	字符串	否	
    指标-白天常驻基站时间（分钟）	METRIC_LAC_DAY_TOTAL_TIME_MINUTES	整型	8659	
    指标-夜间常驻基站时间（分钟）	METRIC_LAC_NIGHT_TOTAL_TIME_MINUTES	整型	4148	
    指标-白天常驻基站连接次数	METRIC_LAC_DAY_LAC_COUNT	整型	12	
    指标-夜间常驻基站连接次数	METRIC_LAC_NIGHT_LAC_COUNT	整型	3	
    属性-家宽地址	ATTR_BRD_ADDR	字符串	朝阳区望京新城15栋061	
    属性-使用产品名称	ATTR_PRODUCT_NAME	字符串	移动看家, 移动高清, 移动康养, 移动车家, 移动云盘,139邮箱, 云手机, 云电脑, 行车卫士, 集团语音	
    属性-所属集团名称	ATTR_GROUP_NAME	字符串	阿里巴巴集团,腾讯控股集团,中国工商银行集团,国家电网公司,华为技术有限公司,中国石油集团,中国建筑集团,顺丰控股集团,新东方教育集团,华润医药集团
    
    属性-信用分总得分	ATTR_CREDIT_SCORE	整型	420-696（北京市4月的真实数据）均值 550	与通话、漫游、教育/金融/旅行/汽车/购物/餐饮app、arpu、宽带、
    属性-到达地址时间	ATTR_ARRIVE_TIME	时间	20240115 06:00:00	
    属性-到达地址	ATTR_ARRIVE_ADDR	字符串	海淀区紫金长安3栋052	
    属性-到达地址类型	ATTR_ARRIVE_ADD_TYPE	字符串	住宅、公司、餐厅、超市、景点、影院、4S店、小学、中学、大学	
    属性-到达地址经度	ATTR_ARRIVE_LONGITUDE	浮点型	116.3108	
    属性-到达地址纬度	ATTR_ARRIVE_LATITUDE	浮点型	39.9072	
    指标-到达地址停留时间（分钟）	METRIC_ARRIVE_STAY_TIME	整型	607	
    属性-到达地址基站	ATTR_ARRIVE_LAC_CODE	字符串	L00014	
    指标-通话时间	METRIC_CALL_TIMESTAMP	时间	20240101 11:48:00	
    属性-通话对端号码	ATTR_CALL_NUMBER	字符串	18517699330	
    属性-通话漫游类型	ATTR_CALL_ROAMING_TYPE	字符串	国内、国际	
    指标-通话时长（分钟）	METRIC_CALL_DURATION_MINUTES	浮点型	2.4	
    指标-通话费用	METRIC_CALL_APP_COST_RMB	浮点型	0	
    指标-APP使用时间	METRIC_TIMESTAMP	时间	2024/1/1 7:00	
    指标-APP上行流量（MB）	METRIC_APP_UPLOAD_TRAFFIC_MB	浮点型	1.34	
    指标-APP下行流量（MB）	METRIC_APP_DOWNLOAD_TRAFFIC_MB	浮点型	2.67	
    指标-APP在线时长（分钟）	METRIC_APP_ONLINE_DURATION_MINUTES	整型	14	
    属性-APP名称	ATTR_APP_USED	字符串	微信、抖音、支付宝、淘宝、拼多多、高德地图、QQ、快手、百度、京东、小红书、微博、美团、滴滴出行、哔哩哔哩、饿了么、WPS Office、腾讯视频、爱奇艺、携程、夸克、百度网盘、Soul、知乎、百度地图、网易新闻、虎牙直播、番茄小说、剪映、懂车帝	
    指标-APP花费（RMB）	ATTR_APP_COST_RMB	浮点型	0	
    属性-集团产品名称	ATTR_GROUP_PRODUCT_NAME	字符串	移动看家, 移动高清, 移动康养, 移动车家, 移动云盘,139邮箱, 云手机, 云电脑, 行车卫士, 集团语音	                
    """

    demo_template = """
    1. 北京市近一周每日总家宽条数的变化
    ```sql
    
    SELECT 
        STATIS_TIME AS '日期',
        SUM(ATTR_BROADBAND_COUNT) AS '总家宽条数'
    FROM 
        user_data
    WHERE 
        PROV_ID = '北京'
        AND STATIS_TIME BETWEEN '20250725' AND '20250731'
        AND ATTR_BROADBAND_COUNT IS NOT NULL
    GROUP BY 
        STATIS_TIME
    ORDER BY 
        STATIS_TIME ASC;
    ```
    
    2、北京市2025年1月每日移动套餐用户数变化
    ```sql
    SELECT 
        STATIS_TIME AS '日期',
        COUNT(DISTINCT USER_ID) AS '移动套餐用户数'
    FROM 
        user_data
    WHERE 
        PROV = '北京'
        AND STATIS_TIME BETWEEN '20250101' AND '20250131'
        AND LABEL_IS_DIFF = 0
    GROUP BY 
        STATIS_TIME
    ORDER BY 
        STATIS_TIME ASC;
    ```
    
    3、北京市2025年1月家庭宽带用户日均在线时长
    ```sql
    SELECT 
    STATIS_TIME AS '日期',
        AVG(METRIC_BROADBAND_ONLINETIME) AS '日均在线时长'
    FROM 
        user_data
    WHERE 
        PROV = '北京'
        AND ATTR_BROADBAND_COUNT > 0
        AND STATIS_TIME BETWEEN '20250101' AND '20250131'
    GROUP BY 
        STATIS_TIME
    ORDER BY 
        STATIS_TIME ASC;
    ```
    """

    data_sample = """
    20250101|北京|P39752|13697491495|U22808|C77213|72|女|北京市|密云区|不老屯镇|G00130|39.5|115.94|B06647|40.12|116.63|B00067|39.8|116.69|稳定型|0|0|0|0|0|1|FC00614|GEO00169|SC00885|CYC00362|CPC00886|CTC00470|BC00283|OC00534|274.117615.0|50950.0|201.57|71.66|49.4|16.5|72.02|32.27|1.42|15.61|18.58|48|20190511|和飞享套餐|82|311||陕西省丽娟县魏都向街t座 471483|否|856|615|19|9|河北省邯郸市友好澳门路O座 922221|139邮箱|国家电网公司|579|20240512 04:42:30|广西壮9|127|L00320|20240304 20:20:56|15213535211|国际|16.8|6.46|20240518 11:07:19|7.59|7.6|8|京东|12.24|移动高清
    20250101|北京|P71379|13944849915|U20652|C19173|35|女|北京市|石景山区|广宁街道|G00627|40.87|115.63|B02638|40.14|115.42|B02740|40.24|116.56|波动型|0|1|0|0|1|0|FC00927|GEO00404|SC00965|CYC00235|CPC00145|CTC00799|BC00507|OC00900|4462114.0|63776.0|217.85|43.24|4.52|21.84|68.18|45.18|2.15|39.0|15.33|37|20160121|天翼畅享套餐|9|574||上海市齐齐哈尔县花溪淮安路K座 165899|是|536|517|12|9|上海市北京市秀英孙街C座 181545|云手机|顺丰控股集团|580|20240903 18:02:51|江8|L09841|20241128 04:10:03|13464530864|国内|42.6|6.67|20240901 08:30:04|9.31|29.83|71|爱奇艺|19.85|行车卫士
    20250101|北京|P38664|15612803181|U09527|C89431|43|男|北京市|怀柔区|九渡河镇|G00987|40.43|115.81|B00973|40.83|116.21|B00374|40.93|115.89|稳定型|0|0|0|1|0|1|FC00999|GEO00186|SC00887|CYC00857|CPC00881|CTC00633|BC00337|OC00914|196.62322.0|85831.0|142.28|62.58|39.06|18.59|18.25|33.87|23.94|44.71|13.16|149|20110105|冰淇淋套餐|86|663||辽宁省瑞市怀柔秦路X座 719788|是|606|307|7|2|湖北省东莞县锡山兴安盟路z座 448679|集团语音|顺丰控股集团|665|20240320 02:04:09|甘|574|L07281|20240619 07:35:00|13955600909|国内|49.9|1.46|20241122 17:35:20|5.32|31.76|37|番茄小说|27.21|移动云盘
    """

    sql_generation_template = f"""
    你是一位资深数据库分析师，精通SQL语法和语义解析，擅长将自然语言查询转化为高效准确的SQL语句。请严格遵守数据库安全规范，仅生成SELECT查询语句。 
    请参考用户以自然语言描述的查询需求，问题关键变量，数据库结构，样例数据和生成sql的样例，将用户的sql_query转化为可执行的sql语句。
       
    用户以自然语言描述的查询需求是:
    {sql_query}
    
    问题关键变量:
    {query_key_parameter}
    
    数据库结构：
    {schema_description}
    
    样例数据:
    {data_sample}
    
    生成sql的样例：
    {demo_template}
    
    要求：
    1. 只输出SQL语句，直接输出字符串，不要包含解释，语句前后不要包含"```sql""```"
    2. 使用标准SQL语法
    3. 确保查询效率
    4. 请预先测试，不要有语法错误
    5. 不要直接使用demo_template中的具体数据，demo_template只是用来参考学习sql的生成格式和生成逻辑
"""

    response = deepseek_response(sql_generation_template)

    return response


if __name__ == "__main__":

    mcp.run(transport="stdio")